/*
 * bsp_-clock.c
 *
 *  Created on: 2021年7月29日
 *      Author: wetop
 */


//#include <msp430.h>
#include "bsp_clock.h"
#include "msp430F5529.h"
/*
 * Jeason 2019.05.09 于青岛大学
 * QQ: 1666532400
 */

// 主频初始化函数 可以设置指定的频率
void test_main(void)
{
    int i;
    WDTCTL = WDTPW | WDTHOLD;       // stop watchdog timer
    clock_init(40);
    P2DIR |= BIT2;  // 配置P2.2为输出模式
    P2SEL |= BIT2;  // 功能复用:SMCLK输出 （子系统主时钟）
    P7DIR |= BIT7;  // 配置P7.7为输出模式
    P7SEL |= BIT7;  // 功能复用:MCLK输出    （主系统时钟）
    P1DIR |= BIT0;  // 配置P1.0为输出模式
    while(1)
    {
    }
}

void clock_init(unsigned char Fre)
{

    P5SEL |= BIT2|BIT3|BIT4|BIT5;//开启外部两个时钟

    UCSCTL6 |= XCAP_3|XT1OFF;          // XT1 相关 配置
    UCSCTL6 |= XT2DRIVE_0 |XT2OFF;     // XT2 相关 配置
//以下是提升核心电压部分的代码
    PMMCTL0_H = 0xA5;                                         //开PMM电源管理
    SVSMLCTL |= SVSMLRRL_1 + SVMLE;                            //配置SVML电压
    PMMCTL0 =  PMMPW + PMMCOREV_3;                             //配置内核电压
    while((PMMIFG & SVSMLDLYIFG ) == 0);                       //等待设置完成
    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);
    if((PMMIFG & SVMLIFG) == 1)                                //判断内核电压是否上升到VSVML
         while((PMMIFG & SVMLVLRIFG) == 0);                   //如果没有等待
    SVSMLCTL &= ~SVMLE;                                        //关掉SVML模块
    PMMCTL0_H = 0X00;

    __bis_SR_register(SCG0);                 //该语法为固定格式，意为将括号内的变量置位，SCG0与系统工作模式有关，此时 MCLK 暂停工作
    UCSCTL0 = 0;                             //先清零，FLL 运行时，该寄存器系统会自动配置，不用管
    UCSCTL6 = (UCSCTL6&(~(XT2OFF|XT1OFF))|XCAP_3|XT2DRIVE_0);
    UCSCTL3 = (5<<4);                       // 选择 XTAL2 的时钟信号作为参考信号
    UCSCTL1 = DCORSEL_7;                     //自动修正  这里必须选择7!
//    UCSCTL2 = FLLD_0 | 9;                    //FLLD=1,FLLN=9,则频率为1*（9+1）*4MHz=40MHZ‬
//    UCSCTL2 = FLLD_1 | 5;                    //FLLD=2,FLLN=4,则频率为2*（5+1）*4MHz=48MHZ‬
    UCSCTL2 = FLLD_0 | 5;                    //FLLD=1,FLLN=5,则频率为1*（5+1）*4MHz=24MHZ‬
//    UCSCTL2 = FLLD_0 | 6;                    //FLLD=1,FLLN=6,则频率为1*（6+1）*4MHz=28MHZ‬
//    UCSCTL2 = FLLD_0 | 7;                    //FLLD=1,FLLN=7,则频率为1*（7+1）*4MHz=32MHZ‬
//    UCSCTL2 = FLLD_0 | 8;                    //FLLD=1,FLLN=8,则频率为1*（8+1）*4MHz=36MHZ‬
//    UCSCTL2 = FLLD_0 | 9;                    //FLLD=1,FLLN=9,则频率为1*（9+1）*4MHz=40MHZ‬
    //UCSCTL2 = FLLD_0 | 10;                   //FLLD=1,FLLN=9,则频率为1*（10+1）*4MHz=44MHZ‬
    __bic_SR_register(SCG0);
    __delay_cycles(782000);
    while (SFRIFG1 & OFIFG) {                               // Check OFIFG fault flag
      UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);           // Clear OSC flaut Flags
      SFRIFG1 &= ~OFIFG;                                    // Clear OFIFG fault flag
    }
    UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
}


